#Requires AutoHotkey v2.0

;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;;
; 图形界面

class JGui {

    display() {

        ; 创建一个新的 GUI 窗口，窗口名为 "文件比较"
        tWindow := Gui(, "文件嵌套解压")

        ; 创建一个嵌套解压对象
        jy := QianTaoJieYa()

        ; 配置嵌套解压参数
        jy.JieYaRanJian := IniRead("qianTaoJieYa.ini","qianTaoJieYa", "JieYaRanJian", "读取失败")

        ; 添加一个文本域，占据整个窗口，并设置默认文本
        w_board := tWindow.Add("Edit", "w600 h400 -Wrap Cred", "请将需要解压的文件拖入窗口(1个)...")

        ; 绑定拖拽事件处理函数
        tWindow.OnEvent("DropFiles",tWindow_DropFiles)

        ; 拖拽事件处理函数
        tWindow_DropFiles(GuiObj, GuiCtrlObj, FileArray, X, Y) {
            w_board.Value := "解压中，请耐心等待(可能时间有点长)..."
            for i, DroppedFile in FileArray {
                jy.qianTaoJieYa(DroppedFile)
            }
            w_board.Value := "解压完成..."
        }

        ; 显示窗口
        tWindow.Show()
    }
}

j := jGui()
j.display()
;a := QianTaoJieYa()
; a.jieYa("D:\window\documents\练习图纸\clip\code\test01\gui01\YaShuoBao.rar")
;a.qianTaoJieYa("D:\window\documents\练习图纸\clip\code\test01\gui01\测试文件.rar")
;MsgBox "end"

;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;; ;;;;;

; 嵌套解压(依赖类)
class QianTaoJieYa {

    JieYaRanJian := "D:\app\WinRAR\WinRAR.exe"
    YaShuoWenJianGeShi := ["zip", "rar"]

    ; 解压(文件)
    jieYa(fileName) {
        parentPath := this._gPBLS(fileName)
        return RunWait(this.JieYaRanJian . " X " . fileName . " " . ParentPath)
    }

    ; 嵌套解压(文件)
    qianTaoJieYa(fileName) {

        ; 判断文件是否存在(如果文件不存在，直接返回)
        if (!FileExist(fileName)) {
            return "文件不存在"
        }

        ; 标记是否跳出循环
        flag := true

        ; 解压文件的主路径(压缩包所在的上一层目录)
        mainPath := this._gPBLS(fileName)

        ; 遍历主路径下的所有文件(夹)，
        ; 如果有压缩包，解压它，解压之后删除解压过的压缩包
        ; 重复上面操作
        ; 直到主路径下(包括子目录)没有压缩包为止
        while (flag) {
            Loop Files, mainPath "\*", "DFR" { ; 遍历主路径下的所有文件(夹)
                loop this.YaShuoWenJianGeShi.Length {
                    if (this.YaShuoWenJianGeShi[A_Index] = A_LoopFileExt) {

                        ; 解压压缩包
                        this.jieYa(A_LoopFileFullPath)
                        ; 解压之后删除原来的压缩包
                        FileDelete(A_LoopFileFullPath)
                        ; 告诉程序主路径下可能还有压缩包
                        flag := true
                        break
                    }

                    ; 执行到之这里证明没有压缩包了，跳出循环
                    flag := false
                }
            }


        }

    }

    ; 截取最后一个反斜杠之前的字符串(Get Path Before Last Slash )
    _gPBLS(path) {

        ; 找到最后一个反斜杠的位置
        lastSlashPos := InStr(path, "\", "On", , -1)

        ; 如果没有反斜杠,将路径转换为绝对路径(继续寻找反斜杠)
        if (lastSlashPos == 0) {
            path := A_WorkingDir "\" path
            return this._gPBLS(path)
        }

        ; 截取路径中最后一个反斜杠之前的部分
        temp := SubStr(path, 1, lastSlashPos)

        ; 去掉 "\"
        return SubStr(temp, 1, -1)

    }

}